﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Drawing;
using Joel.Vishnu.AccesoDatos.SQL_Server;
using Joel.Vishnu.AccesoDatos.Interfaces;
using Joel.Vishnu.Modelo.Entidades;

namespace Joel.Vishnu.Repositorios
{
    public class RepositorioProducto : RepositorioEntidad<Producto, Int32>
    {
        #region Constructores

        public RepositorioProducto()
            : base()
        {
            servicioDatosProducto = new ServicioDatosProducto();
        }

        #endregion

        #region Atributos

        private IServicioDatosProducto servicioDatosProducto;

        #endregion

        #region Propiedades

        public IServicioDatosProducto ServicioDatosProducto
        {
            get { return servicioDatosProducto; }
        }

        private RepositorioProductoSubCategoria RepositorioProductoSubCategoria
        {
            get { return new RepositorioProductoSubCategoria(); }
        }

        #endregion

        #region Metodos

        protected override Producto FilaAEntidad(DataRow fila)
        {
            var producto = new Producto();
            producto.Id = (Int32)fila["ProductoId"];
            producto.Nombre = (String)fila["Nombre"];
            producto.Observacion = (String)fila["Observacion"];
            producto.PrecioLista = (Decimal)fila["PrecioLista"];
            producto.PrecioDistribuidor = (Decimal)fila["PrecioDistribuidor"];
            producto.ProductoSubCategoria = RepositorioProductoSubCategoria.DevolverPorId((Int32)fila["ProductoSubCategoriaId"]);
            return producto;
        }

        public override Producto DevolverPorId(Int32 id)
        {
            //var entidad = entidades.Where(x => x.Id == id).FirstOrDefault();
            //var entidad = (from item in entidades
            //               where item.Id == id
            //               select item).FirstOrDefault();
            Producto entidad = null;
            foreach (Producto item in entidades)
            {
                if (item.Id == id)
                {
                    entidad = item;
                    break;
                }

            }
            if (entidad == null)
                using (var ds = ServicioDatosProducto.Productos_DevolverPorId(id))
                    if (ds.Tables[0].Rows.Count != 0)
                    {
                        entidad = FilaAEntidad(ds.Tables[0].Rows[0]);
                        entidades.Add(entidad);
                    }
            return entidad;
        }

        public List<Producto> DevolverTodos()
        {
            using (var ds = ServicioDatosProducto.Productos_DevolverTodos())
                entidades = TablaALista(ds.Tables[0]);
            return entidades;
        }

        public void Insertar(Producto entidad)
        {
            entidad.Id = ServicioDatosProducto.Productos_Insertar(entidad.Nombre, entidad.Observacion, entidad.PrecioLista, entidad.PrecioDistribuidor, entidad.ProductoSubCategoria.Id);
        }

        public void Modificar(Producto entidad)
        {
            ServicioDatosProducto.Productos_Modificar(entidad.Id, entidad.Nombre, entidad.Observacion, entidad.PrecioLista, entidad.PrecioDistribuidor, entidad.ProductoSubCategoria.Id);
        }

        public void Eliminar(Producto entidad)
        {
            ServicioDatosProducto.Productos_Eliminar(entidad.Id);
            entidad = null;
        }

        #endregion
    }
}
